package com.zeropoint.demo.service.impl;

import cn.hutool.poi.excel.ExcelUtil;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.zeropoint.demo.mapper.FormTotalMapper;
import com.zeropoint.demo.mapper.UserMapper;
import com.zeropoint.demo.pojo.*;
import com.zeropoint.demo.pojo.vo.*;
import com.zeropoint.demo.util.ExcelUtils;
import com.zeropoint.demo.util.JwtUtil;
import org.apache.shiro.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.zeropoint.demo.service.FormTotalService;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.util.*;


@Service
public class FormTotalServiceImpl implements FormTotalService {


    public static void prepareSheet2(List<List<Object>> sheet2){

        // 准备第二张表的内容

        List<Object> sheet2Head = new ArrayList<>();
        sheet2Head.add(" ");
        sheet2Head.add("1.1答卷人基本信息");
        addColumnMerge(sheet2Head,9);
        sheet2Head.add("1.2家庭人口相关信息");
        addColumnMerge(sheet2Head,70);
        sheet2Head.add("1.3家庭共同生活成员特殊信息");
        addColumnMerge(sheet2Head,3);
        sheet2.add(sheet2Head);
        // 纵向合并
        List<Object> row01 = new ArrayList<>();
        row01.add("问卷编号");
        row01.add("姓名");
        row01.add("身份证");
        row01.add("联系方式");
        row01.add("年龄");
        row01.add("性别");
        row01.add("民族");
        row01.add("婚姻状况");
        row01.add("受教育程度");
        row01.add("家庭人数");
        row01.add("家庭类型");
        row01.add("16岁以下");
        addColumnMerge(row01,13);
        row01.add("17-18岁");
        addColumnMerge(row01,18);
        row01.add("19-60岁");
        addColumnMerge(row01,18);
        row01.add("60岁以上");
        addColumnMerge(row01,18);
        row01.add("家庭中是否存在因赌博、吸毒或其他违反国家法律法规拒不改正现象");
        row01.add("共同生活成员出入境经历情况");
        addColumnMerge(row01,2);
        List<Object> row02 = new ArrayList<>();
        // 第三行
        addRowMerge(row02, 11);
        row02.add("性别");
        addColumnMerge(row02,1);
        row02.add("健康状况");
        addColumnMerge(row02,6);
        row02.add("受教育程度");
        addColumnMerge(row02,4);
        row02.add("性别");
        addColumnMerge(row02,1);
        row02.add("健康状况");
        addColumnMerge(row02,6);
        row02.add("劳动力就业");
        addColumnMerge(row02,3);
        row02.add("受教育程度");
        addColumnMerge(row02,5);
        row02.add("性别");
        addColumnMerge(row02,1);
        row02.add("健康状况");
        addColumnMerge(row02,6);
        row02.add("劳动力就业");
        addColumnMerge(row02,3);
        row02.add("受教育程度");
        addColumnMerge(row02,5);
        row02.add("性别");
        addColumnMerge(row02,1);
        row02.add("健康状况");
        addColumnMerge(row02,6);
        row02.add("劳动力就业");
        addColumnMerge(row02,3);
        row02.add("受教育程度");
        addColumnMerge(row02,5);
        addRowMerge(row02,1);
        row02.add("是否");
        row02.add("缘由");
        row02.add("目的地");


        List<Object> row03 = new ArrayList<>();
        // 第四行
        addRowMerge(row03, 11);

        row03.add("男");
        row03.add("女");
        row03.add("良好");
        row03.add("患慢性病");
        row03.add("患慢性病人数");
        row03.add("患重大疾病");
        row03.add("患重大疾病人数");
        row03.add("残疾人数");
        row03.add("残疾");
        row03.add("文盲");
        row03.add("学龄前");
        row03.add("小学");
        row03.add("初中");
        row03.add("高中");

        row03.add("男");
        row03.add("女");
        row03.add("良好");
        row03.add("患慢性病");
        row03.add("患慢性病人数");
        row03.add("患重大疾病");
        row03.add("患重大疾病人数");
        row03.add("残疾人数");
        row03.add("残疾");
        row03.add("农业生产");
        row03.add("外出务工");
        row03.add("休业");
        row03.add("待业");
        row03.add("文盲");
        row03.add("学龄前");
        row03.add("小学");
        row03.add("初中");
        row03.add("高中");
        row03.add("大专及以上");


        row03.add("男");
        row03.add("女");
        row03.add("良好");
        row03.add("患慢性病");
        row03.add("患慢性病人数");
        row03.add("患重大疾病");
        row03.add("患重大疾病人数");
        row03.add("残疾人数");
        row03.add("残疾");
        row03.add("农业生产");
        row03.add("外出务工");
        row03.add("休业");
        row03.add("待业");
        row03.add("文盲");
        row03.add("学龄前");
        row03.add("小学");
        row03.add("初中");
        row03.add("高中");
        row03.add("大专及以上");


        row03.add("男");
        row03.add("女");
        row03.add("良好");
        row03.add("患慢性病");
        row03.add("患慢性病人数");
        row03.add("患重大疾病");
        row03.add("患重大疾病人数");
        row03.add("残疾人数");
        row03.add("残疾");
        row03.add("农业生产");
        row03.add("外出务工");
        row03.add("休业");
        row03.add("待业");
        row03.add("文盲");
        row03.add("学龄前");
        row03.add("小学");
        row03.add("初中");
        row03.add("高中");
        row03.add("大专及以上");
        addRowMerge(row03,1);
        addRowMerge(row03,1);
        addRowMerge(row03,1);
        addRowMerge(row03,1);

        sheet2.add(row01);
        sheet2.add(row02);
        sheet2.add(row03);


    }

    public static void prepareSheet1(List<List<Object>> sheet2){

        // 准备第一张表的内容

        List<Object> sheet2Head = new ArrayList<>();
        sheet2Head.add(" ");
        sheet2Head.add("所在地");
        addColumnMerge(sheet2Head,4);
        sheet2Head.add("2 所在县（区）居民收入状况");
        addColumnMerge(sheet2Head,8);

        // 第二行
        List<Object> row01 = new ArrayList<>();
        row01.add("问卷编号");
        row01.add(" ");
        addColumnMerge(row01,4);
        row01.add(" ");
        addColumnMerge(row01,8);

        // 第三行
        List<Object> row02 = new ArrayList<>();
        addRowMerge(row02,1);
        row02.add("城镇=0；农村=1");

        row02.add("市");
        row02.add("县/区");
        row02.add("镇/街办");
        row02.add("村");
        row02.add("城镇居民人均可支配收入");
        row02.add("城镇居民人均可支配收入");
        row02.add("工资性收入");
        row02.add("经营性收入");
        row02.add("财产性收入");
        row02.add("转移性收入");
        row02.add("该县（市、区）最低生活保障标准");
        row02.add("该县人均耕地面积");
        row02.add("该县人均林地面积");


        // 第四行
        List<Object> row03 = new ArrayList<>();
        addRowMerge(row03, 15);

        sheet2.add(sheet2Head);
        sheet2.add(row01);
        sheet2.add(row02);
        sheet2.add(row03);


    }

    public static void prepareSheet3(List<List<Object>> sheet2){

        // 准备第三张表的内容 (后面的数据不能超过头)

        List<Object> sheet2Head = new ArrayList<>();
        sheet2Head.add(" ");
        sheet2Head.add("2.1 住房情况");
        addColumnMerge(sheet2Head,10);
        sheet2Head.add("2.2 家庭耐用品");
        addColumnMerge(sheet2Head,9);
        sheet2Head.add("2.3土地林地资源");
        addColumnMerge(sheet2Head,7);
        sheet2Head.add("2.4社会资源资产");
        addColumnMerge(sheet2Head,10);
        sheet2.add(sheet2Head);
        // 第二行数据
        List<Object> row01 = new ArrayList<>();
        row01.add("问卷编号");
        row01.add("家庭住房来源");
        addColumnMerge(row01,2);
        row01.add("住房购置时间");
        row01.add("家庭住房面积");
        row01.add("现有住房以外购置（租赁）商品房或商铺");
        addColumnMerge(row01,5);
        row01.add("轿车");
        row01.add("运输车");
        row01.add("空调");
        row01.add("冰箱");
        row01.add("洗衣机");
        row01.add("电视机");
        row01.add("摩托车");
        row01.add("电动车");
        row01.add("电脑");
        row01.add("手机");
        row01.add("家中宅基地数量");
        row01.add("家中现有耕地面积（亩）");
        row01.add("承包耕地面积（亩）");
        row01.add("流转入耕地面积（亩）");
        row01.add("实际种植耕地面积（亩）");
        row01.add("家中现有林地面积（亩）");
        row01.add("家庭每月通讯费用");
        row01.add("每月电费");
        row01.add("家庭发生困难急需大笔开支时愿意借钱资助的亲威朋友户数");
        row01.add("家庭成员本村（社区）干部人数");
        row01.add("村（社区）外干部（人数");
        row01.add("家庭成员中参加商业保险人次（医保、社保除外）");
        row01.add(ExcelUtils.COLUMN_MERGE);
        row01.add("家庭成员中参与社会公益组织人次");
        row01.add("家庭享受过政策贴息借款");
        row01.add(ExcelUtils.COLUMN_MERGE);
        row01.add("家庭向亲戚朋友借款");
        row01.add(ExcelUtils.COLUMN_MERGE);
        row01.add("家庭负债总金额");


        // 第三行
        List<Object> row02 = new ArrayList<>();

        row02.add(ExcelUtils.ROW_MERGE);
        row02.add(" ");
        addColumnMerge(row02,2);
        row02.add(ExcelUtils.ROW_MERGE);
        row02.add(ExcelUtils.ROW_MERGE);
        row02.add(" ");
        addColumnMerge(row02,5);

        addRowMerge(row02,21);
        row02.add(" ");
        row02.add(ExcelUtils.COLUMN_MERGE);

        row02.add(ExcelUtils.ROW_MERGE);
        row02.add(" ");
        row02.add(ExcelUtils.COLUMN_MERGE);
        row02.add(" ");
        row02.add(ExcelUtils.COLUMN_MERGE);
        row02.add(ExcelUtils.ROW_MERGE);


        // 第四行
        List<Object> row03 = new ArrayList<>();
        row03.add(ExcelUtils.ROW_MERGE);
        row03.add("形式");
        row03.add("金额");
        row03.add("月租");
        row03.add(ExcelUtils.ROW_MERGE);
        row03.add(ExcelUtils.ROW_MERGE);
        row03.add("有0");
        row03.add("购买时间");
        row03.add("购置金额");
        row03.add("现值");
        row03.add("月租");
        row03.add("面积");
        row03.add(ExcelUtils.ROW_MERGE);
        addRowMerge(row03,20);
        row03.add("人次");
        row03.add("年支出金额");
        row03.add(ExcelUtils.ROW_MERGE);
        row03.add("有0");
        row03.add("金额（万）");
        row03.add("有0");
        row03.add("金额（万）");
        row03.add("金额（万）");



        sheet2.add(row01);
        sheet2.add(row02);
        sheet2.add(row03);


    }

    public static void prepareSheet4(List<List<Object>> sheet2){

        // 准备第四张表的内容

        List<Object> sheet2Head = new ArrayList<>();
        sheet2Head.add(" ");
        sheet2Head.add("3.1 经营性收入");
        addColumnMerge(sheet2Head,15);
        sheet2Head.add("3.2 工资性收入（月收入）");
        addColumnMerge(sheet2Head,4);
        sheet2Head.add("3.3 财产性收入（年收入）");
        addColumnMerge(sheet2Head,5);
        sheet2Head.add("3.4 转移性收入（年收入）");
        addColumnMerge(sheet2Head,7);
        sheet2.add(sheet2Head);

        // 第二行
        List<Object> row01 = new ArrayList<>();
        row01.add("问卷编号");
        row01.add(" ");
        addColumnMerge(row01,15);
        row01.add(" ");
        addColumnMerge(row01,4);
        row01.add(" ");
        addColumnMerge(row01,5);
        row01.add(" ");
        addColumnMerge(row01,7);

        List<Object> row02 = new ArrayList<>();
        // 第三行
        addRowMerge(row02, 1);
        row02.add("种植业（亩）");
        addColumnMerge(row02,5);
        row02.add("养殖业");
        addColumnMerge(row02,7);
        row02.add("个体经营");
        row02.add("个体经营年收入");
        row02.add("本地务工");
        addColumnMerge(row02,1);
        row02.add("外地务工");
        addColumnMerge(row02,2);
        row02.add("土地流转金");
        row02.add("存款利息");
        row02.add("集体财产分红");
        row02.add("股票利息");
        row02.add("不动产租金");
        row02.add("理财产品分红");
        row02.add("赡（抚）养费");
        row02.add("失地补贴");
        row02.add("林业补贴");
        row02.add("耕地补助");
        row02.add("低保补助");
        row02.add("奖、助学金");
        row02.add("养老、退休金");
        row02.add("特困金");


        List<Object> row03 = new ArrayList<>();
        // 第四行
        addRowMerge(row03, 1);

        row03.add("水稻");
        row03.add("玉米");
        row03.add("蔬菜");
        row03.add("水果");
        row03.add("茶叶");
        row03.add("其他");
        row03.add("牛");
        row03.add("猪");
        row03.add("羊");
        row03.add("鸡");
        row03.add("鸭");
        row03.add("鹅");
        row03.add("鱼塘（亩）");
        row03.add("其他");
        addRowMerge(row03, 2);

        row03.add("人数");
        row03.add("月收入");
        row03.add("地区");
        row03.add("人数");
        row03.add("月收入");
        addRowMerge(row03, 14);


        sheet2.add(row01);
        sheet2.add(row02);
        sheet2.add(row03);


    }

    public static void prepareSheet5(List<List<Object>> sheet2){

        // 准备第四张表的内容

        List<Object> sheet2Head = new ArrayList<>();
        sheet2Head.add(" ");
        sheet2Head.add("4.1家庭日常消费支出");
        addColumnMerge(sheet2Head,6);
        sheet2Head.add("4.2家庭必要刚性支出");
        addColumnMerge(sheet2Head,11);
        sheet2Head.add("4.3社会交往支出");
        addColumnMerge(sheet2Head,2);
        sheet2Head.add("4.4突发性支出");
        addColumnMerge(sheet2Head,1);
        sheet2.add(sheet2Head);

        // 第二行
        List<Object> row01 = new ArrayList<>();
        row01.add("问卷编号");
        row01.add(" ");
        addColumnMerge(row01,6);
        row01.add(" ");
        addColumnMerge(row01,11);
        row01.add(" ");
        addColumnMerge(row01,2);
        row01.add(" ");
        addColumnMerge(row01,1);

        List<Object> row02 = new ArrayList<>();
        // 第三行
        addRowMerge(row02, 1);
        row02.add("主要消费支出项目（多选）");
        row02.add("每月家庭日常生活消费支出");
        row02.add("家庭每月社会养老保险费用");
        row02.add("家庭每月食品支出占比");
        row02.add("家庭每月房贷支出");
        row02.add("月租");
        row02.add("家庭每月通信费用");
        row02.add("求学子女人数");
        row02.add("子女每年教育支出");
        row02.add("学费");
        row02.add("住宿费");
        row02.add("书本费");
        row02.add("生活费");
        row02.add("重大疾病年医疗支出");
        row02.add("个人负担");
        row02.add("慢性疾病每年医疗支出");
        row02.add("个人负担");
        row02.add("因残每年治疗/康复费用");
        row02.add("求职过程必要就业支出");
        row02.add("近一年人情往来次数");
        row02.add("近一年人情往来（包礼）总支出");
        row02.add("平均每次支出");
        row02.add("近一年遭遇突发性事件");
        row02.add("近一年突发性事件支出");

        // 第四行
        List<Object> row03 = new ArrayList<>();
        addRowMerge(row03, 25);


        sheet2.add(row01);
        sheet2.add(row02);
        sheet2.add(row03);


    }

    public static void prepareSheet6(List<List<Object>> sheet2){

        // 准备第六张表的内容

        List<Object> sheet2Head = new ArrayList<>();
        sheet2Head.add(" ");
        sheet2Head.add("数据整理");
        addColumnMerge(sheet2Head,25);
        sheet2Head.add("劳动力（H1)");
        addColumnMerge(sheet2Head,2);
        sheet2Head.add(" ");
        addColumnMerge(sheet2Head,4);
        sheet2Head.add("家庭住房(M1)");
        addColumnMerge(sheet2Head,2);
        sheet2Head.add("家庭财产（M2）");
        sheet2Head.add(" ");
        addColumnMerge(sheet2Head,3);

        sheet2Head.add("社会关系（S1)");
        addColumnMerge(sheet2Head,2);
        sheet2Head.add("社会活动（S2）");
        addColumnMerge(sheet2Head,1);
        sheet2Head.add("借款机会（S3）");
        addColumnMerge(sheet2Head,1);
        sheet2Head.add("社会交往");
        addColumnMerge(sheet2Head,1);
        sheet2Head.add(" ");
        sheet2Head.add(" ");
        sheet2.add(sheet2Head);

        // 第二行
        List<Object> row01 = new ArrayList<>();
        row01.add("问卷编号");
        row01.add("表2.基本情况");
        addColumnMerge(row01,6);
        row01.add("表3.财产状况");
        addColumnMerge(row01,2);
        row01.add("表4.收入情况");
        addColumnMerge(row01,4);
        row01.add("表5.支出情况");
        addColumnMerge(row01,5);
        row01.add("人均收支");
        row01.add("最低生活保障");
        row01.add("人均收入（不含补助）-最低生活保障");
        row01.add("人均收支-1倍最低生活保障");
        row01.add("人均收支-1.5倍最低生活保障");
        row01.add("劳动力数");
        row01.add("主要劳动力占比");
        row01.add("文化程度");

        row01.add("健康状况(H2)");
        row01.add("就业状况(H3)");
        row01.add("宅基地数(N1)");
        row01.add("耕地资源(N2)");
        row01.add("林地资源(N3)");

        row01.add("住房来源");
        row01.add("住房面积");
        row01.add("额外购房");
        row01.add("耐用消费品");

        row01.add("经营性收入（F1）");
        row01.add("工资性收入（F2）");
        row01.add("转移性收入（F3）");
        row01.add("财产性收入（F4）");

        row01.add("家庭成员担任村组干部");
        row01.add("发生困难时得到他人帮助");
        row01.add("家庭日常通讯费用");
        row01.add("家庭成员参与社会组织");
        row01.add("家庭成员参与社会保险");
        row01.add("是否享受政策贴息贷款");
        row01.add("是否向亲戚朋友处借款");
        row01.add("人情往来支出");
        row01.add("人情外来次数");

        row01.add("评定结果");
        row01.add("判定结果");



        List<Object> row02 = new ArrayList<>();
        // 第三行
        addRowMerge(row02, 1);

        row02.add("年龄");
        row02.add("家庭人数");
        row02.add("劳动力残疾比");
        row02.add("人均健康");
        row02.add("19-60岁残疾人数");
        row02.add("残疾类型");
        row02.add("家庭残疾人数");
        row02.add("村外购房");
        row02.add("购房面积");
        row02.add("小汽车");
        row02.add("金融性资产");
        row02.add("赡（抚）养费");
        row02.add("人均收入(不含补助）");
        row02.add("人均收入（含补助）");
        row02.add("个体经营收入");
        row02.add("家庭子女每年教育支出");
        row02.add("重大疾病每年医疗支出");
        row02.add("重大疾病个人医疗支出");
        row02.add("慢性疾病个人负担");
        row02.add("近一年突发性事件支出");
        row02.add("家庭人均支出");

        addRowMerge(row02, 5);

        row02.add("H11");
        row02.add("H12");
        row02.add("H13");
        row02.add("H2");
        row02.add("H3");
        row02.add("N1");
        row02.add("N2");
        row02.add("N3");
        row02.add("M11");
        row02.add("M12");
        row02.add("M13");
        row02.add("M21");
        row02.add("F1");
        row02.add("F2");
        row02.add("F3");
        row02.add("F4");
        row02.add("S11");
        row02.add("S12");
        row02.add("S13");
        row02.add("S21");
        row02.add("S22");
        row02.add("S31");
        row02.add("S32");
        row02.add("S41");
        row02.add("S42");

        addRowMerge(row02, 2);

        List<Object> row03 = new ArrayList<>();
        // 第四行
        addRowMerge(row03, 27);

        row03.add("3.38 ");
        row03.add("4.50 ");
        row03.add("3.38 ");
        row03.add("11.25 ");
        row03.add("2.50 ");
        row03.add("6.00 ");
        row03.add("4.50 ");
        row03.add("4.50 ");
        row03.add("3.60 ");
        row03.add("3.60 ");
        row03.add("4.80 ");
        row03.add("8.00 ");
        row03.add("7.50 ");
        row03.add("7.50 ");
        row03.add("5.00 ");
        row03.add("5.00 ");
        row03.add("1.13 ");
        row03.add("1.13 ");
        row03.add("1.50 ");
        row03.add("1.50 ");
        row03.add("2.25 ");
        row03.add("2.25 ");
        row03.add("1.50 ");
        row03.add("1.50 ");
        row03.add("2.25 ");
        row03.add("100.00 ");

        addRowMerge(row03, 1);


        sheet2.add(row01);
        sheet2.add(row02);
        sheet2.add(row03);


    }

    public static void addColumnMerge(List<Object> sheet,int n){

        for(int i = 1;i <= n;i ++){
            sheet.add(ExcelUtils.COLUMN_MERGE);
        }

    }

    public static void addRowMerge(List<Object> row,int n){

        for(int i = 1;i <= n;i ++){
            row.add(ExcelUtils.ROW_MERGE);
        }

    }


    @Resource
    private FormTotalMapper formTotalMapper;

    @Resource
    private UserMapper userMapper;

    /**
     * 添加用户问卷与结果
     * @param totalPor
     */
    @Override
    @Transactional
    public void addFormTotalPor(FormTotalPor totalPor) {
        Questionnaire_base_info base = totalPor.getFormTotal().getQuestionnaire_base_info();
        base.questionnaire_number = createUUID(); //自定义问卷编号
        formTotalMapper.insertBase(base);
        formTotalMapper.insertInfo(totalPor.getFormTotal().getQuestionnaire_info(), base.questionnaire_id);
        formTotalMapper.insertFormOne(totalPor.getFormTotal().getFormOne(), base.questionnaire_id);
        formTotalMapper.insertFamily(totalPor.getFormTotal().getFormOne().family, base.questionnaire_id);
        formTotalMapper.insertFormTwo(totalPor.getFormTotal().getFormTwo(), base.questionnaire_id);
        formTotalMapper.insertFormThree(totalPor.getFormTotal().getFormThree(), base.questionnaire_id);
        formTotalMapper.insertFormFour(totalPor.getFormTotal().getFormFour(), base.questionnaire_id);
        formTotalMapper.insertW(totalPor.getW(), base.questionnaire_id);
    }

    @Override
    @Transactional
    public PageInfo<BasicQuestionnaireInfo> queryBasicInfo(Integer currentPage, Integer pageSize) throws NullPointerException {
        //获取当前用户的信息
        String token = (String) SecurityUtils.getSubject().getPrincipal();
        String username = JwtUtil.getClaim(token);
        UserPO user = userMapper.getUserByName(username);
        //先判定该用户的管辖等级
        Integer roleId = userMapper.selectRoleIdByUserName(username);
        if(roleId == null) throw new NullPointerException("无法确定当前管理员管辖等级");
        //再判定该用户的管辖地区
        String region = user.getRegion();
        //分页
        PageHelper.startPage(currentPage, pageSize);
        //根据等级和地区查找对应的问卷
        List<BasicQuestionnaireInfo> infos = formTotalMapper.selectBasicInfo(roleId, region);
        //处理infos
        tranInfo(infos);
        return new PageInfo<>(infos);
    }

    private static void tranInfo(List<BasicQuestionnaireInfo> infos){

        for(BasicQuestionnaireInfo info : infos){
            if(info.homestyle.equals(info.homestyle_)){
                info.isHomeStyle = true;
            }else{
                info.isHomeStyle = false;
            }
        }
    }


    @Override
    public void deleteBasicInfo(int questionnaire_id) throws Exception {

        boolean isSuccess = formTotalMapper.deleteBasicInfo(questionnaire_id);
        if(!isSuccess) throw new Exception("删除失败");
    }

    private static String createUUID(){
        String s = UUID.randomUUID().toString();
        return s.substring(15).replace("-", "");
    }

    //查询FormTotalPor
    @Override
    @Transactional
    public List<FormTotalPor> queryFormTotalPor(int[] ids) {

        List<FormTotalPor> pors = formTotalMapper.queryFormTotalPor(ids);
        for (FormTotalPor por : pors){
            //将Family进行汇总
            HumanResourceStandardized h = new HumanResourceStandardized().dataSummary(por.getFormTotal().getFormOne().getFamily());
            por.setH(h);
        }

        return pors;
    }

    @Override
    public void exportSheets(HttpServletResponse response, int[] ids) {

        // 1、根据 id 列表获取5个表的数据
        List<FormTotalPor> formTotalPors = queryFormTotalPor(ids);
        //List<FormTotalPor> formTotalPors = queryFormTotalPor(ids);

        // 2、填充表格模板
        List<List<Object>> sheet2 = new ArrayList<>();
        List<List<Object>> sheet1 = new ArrayList<>();
        List<List<Object>> sheet3 = new ArrayList<>();
        List<List<Object>> sheet4 = new ArrayList<>();
        List<List<Object>> sheet5 = new ArrayList<>();
        List<List<Object>> sheet6 = new ArrayList<>();
        FormTotalServiceImpl.prepareSheet1(sheet1);
        FormTotalServiceImpl.prepareSheet2(sheet2);
        FormTotalServiceImpl.prepareSheet3(sheet3);
        FormTotalServiceImpl.prepareSheet4(sheet4);
        FormTotalServiceImpl.prepareSheet5(sheet5);
        FormTotalServiceImpl.prepareSheet6(sheet6);

        // 2、把数据填充到 sheet 中
        exportOne(formTotalPors, sheet1);
        exportTwo(formTotalPors, sheet2);
        exportThree(formTotalPors, sheet3);
        exportFour(formTotalPors,sheet4);
        exportFive(formTotalPors,sheet5);
        exportSix(formTotalPors,sheet6);

        // 3、将 Sheet 页添加到集合中
        Map<String, List<List<Object>>> sheets = new LinkedHashMap<>();
        sheets.put("表1.家庭所在地区（原始数据）", sheet1);
        sheets.put("表2.个人及家庭基本情况（原始数据）", sheet2);
        sheets.put("表3.家庭财产情况（原始数据）", sheet3);
        sheets.put("表4.家庭收入情况（原始数据）", sheet4);
        sheets.put("表5.家庭支出情况（原始数据）", sheet5);
        sheets.put("结果判定", sheet6);

        // 4、导出数据
        //ExcelUtils.exportManySheet(response, "低收入家庭类型判定过程表", sheets);
        ExcelUtils.exportManySheet(response, "2", sheets);


    }

    private void exportOne(List<FormTotalPor> formTotalPors,List<List<Object>> sheet1) {



        List<Object> row1;
        for (FormTotalPor formTotalPor : formTotalPors) {

            row1 = new ArrayList<>();

            Questionnaire_base_info questionnaire_base_info = formTotalPor.getFormTotal().getQuestionnaire_base_info();
            int questionnaire_id = questionnaire_base_info.questionnaire_id;
            Questionnaire_info questionnaire_info = formTotalPor.getFormTotal().getQuestionnaire_info();
            // 问卷 id
            row1.add(questionnaire_id);
            // 日常消费支出
            row1.add(questionnaire_base_info.isCity);
            row1.add(questionnaire_base_info.city);
            row1.add(questionnaire_base_info.county);
            row1.add(questionnaire_base_info.town);
            row1.add(questionnaire_base_info.village);
            row1.add(questionnaire_info.city_disposable_income);
            row1.add(questionnaire_info.village_disposable_income);
            row1.add(questionnaire_info.wage_income);
            row1.add(questionnaire_info.operational_income);
            row1.add(questionnaire_info.property_income);
            row1.add(questionnaire_info.transfer_income);
            row1.add(questionnaire_info.minimum_living_level);
            row1.add(questionnaire_info.cultivatedPer);
            row1.add(questionnaire_info.forestPer);



            sheet1.add(row1);
        }


    }

    private void exportTwo(List<FormTotalPor> formTotalPors,List<List<Object>> sheet2) {


        List<Object> row1;
        for (FormTotalPor formTotalPor : formTotalPors) {

            row1 = new ArrayList<>();
            int questionnaire_id = formTotalPor.getFormTotal().getQuestionnaire_base_info().questionnaire_id;
            FormOne formOne = formTotalPor.getFormTotal().getFormOne();
            HumanResourceStandardized h = formTotalPor.getH(); // 家庭人口相关信息
            // 问卷 id
            row1.add(questionnaire_id);

            row1.add(formOne.name);
            row1.add(formOne.idCard);
            row1.add(formOne.phoneNumber);
            row1.add(formOne.user_age);
            row1.add(formOne.user_sex);
            row1.add(formOne.user_nation);
            row1.add(formOne.if_marriage);
            row1.add(formOne.education_level);
            row1.add(formOne.total_people_num);
            row1.add(formOne.homestyle);

            // 16岁相关信息
            row1.add(h.numberUnder16_m_num);
            row1.add(h.numberUnder16_w_num);
            row1.add(h.numberUnder16_good);
            row1.add(h.numberUnder16_chronic_disease_info == null ? " " : Arrays.toString(h.numberUnder16_chronic_disease_info));
            row1.add(h.numberUnder16_chronicDiseases);
            row1.add(h.numberUnder16_major_disease_info == null ? " " : Arrays.toString(h.numberUnder16_major_disease_info));
            row1.add(h.numberUnder16_majorDiseases);
            row1.add(h.numberUnder16_disability);
            row1.add(h.numberUnder16_disabled_info == null ? " ": Arrays.toString(h.numberUnder16_disabled_info));
            row1.add(h.numberUnder16_illiterate);
            row1.add(h.numberUnder16_pre);
            row1.add(h.numberUnder16_primary);
            row1.add(h.numberUnder16_junior);
            row1.add(h.numberUnder16_high);

            // 17-18
            row1.add(h.numberOfAged17_18_m_num);
            row1.add(h.numberOfAged17_18_w_num);
            row1.add(h.numberOfAged17_18_good);
            row1.add(h.numberOfAged17_18_chronic_disease_info == null? " ":Arrays.toString(h.numberOfAged17_18_chronic_disease_info));
            row1.add(h.numberOfAged17_18_chronicDiseases);
            row1.add(h.numberOfAged17_18_major_disease_info == null? " ":Arrays.toString(h.numberOfAged17_18_major_disease_info));
            row1.add(h.numberOfAged17_18_majorDiseases);
            row1.add(h.numberOfAged19_60_disability); // 残疾人数
            row1.add(h.numberOfAged17_18_disabled_info == null ? " ":Arrays.toString(h.numberOfAged17_18_disabled_info));
            // 劳动力就业
            row1.add(h.numberOfAged17_18_agriculturalProduction);
            row1.add(h.numberOfAged17_18_migrantWorkers);
            row1.add(h.numberOfAged17_18_closedDown);
            row1.add(h.numberOfAged17_18_unemployed);
            row1.add(h.numberOfAged17_18_illiterate);
            row1.add(h.numberOfAged17_18_pre);
            row1.add(h.numberOfAged17_18_primary);
            row1.add(h.numberOfAged17_18_junior);
            row1.add(h.numberOfAged17_18_high);
            row1.add(h.numberOfAged17_18_collegeDegreeOrAbove);

            // 19-60
            row1.add(h.numberOfAged19_60_m_num);
            row1.add(h.numberOfAged19_60_w_num);
            row1.add(h.numberOfAged19_60_good);
            row1.add(h.numberOfAged19_60_chronic_disease_info == null ? " " : Arrays.toString(h.numberOfAged19_60_chronic_disease_info));
            row1.add(h.numberOfAged19_60_chronicDiseases);
            row1.add(h.numberOfAged19_60_major_disease_info == null ? " " : Arrays.toString(h.numberOfAged19_60_major_disease_info));
            row1.add(h.numberOfAged19_60_majorDiseases);
            row1.add(h.numberOfAged19_60_disability); // 残疾人数
            row1.add(h.numberOfAged19_60_disabled_info == null ? " " : Arrays.toString(h.numberOfAged19_60_disabled_info) == null);
            // 劳动力就业
            row1.add(h.numberOfAged19_60_agriculturalProduction);
            row1.add(h.numberOfAged19_60_migrantWorkers);
            row1.add(h.numberOfAged19_60_closedDown);
            row1.add(h.numberOfAged19_60_unemployed);
            row1.add(h.numberOfAged19_60_illiterate);
            row1.add(h.numberOfAged19_60_pre);
            row1.add(h.numberOfAged19_60_primary);
            row1.add(h.numberOfAged19_60_junior);
            row1.add(h.numberOfAged19_60_high);
            row1.add(h.numberOfAged19_60_collegeDegreeOrAbove);

            // 60以上
            row1.add(h.numberOfOver60_m_num);
            row1.add(h.numberOfOver60_w_num);
            row1.add(h.numberOfOver60_good);
            row1.add(h.numberOfOver60_chronic_disease_info == null ? " " : Arrays.toString(h.numberOfOver60_chronic_disease_info));
            row1.add(h.numberOfOver60_chronicDiseases);
            row1.add(h.numberOfOver60_major_disease_info == null ? " " : Arrays.toString(h.numberOfOver60_major_disease_info) );
            row1.add(h.numberOfOver60_majorDiseases);
            row1.add(h.numberOfOver60_disability); // 残疾人数
            row1.add(h.numberOfOver60_disabled_info == null ? " " : Arrays.toString(h.numberOfOver60_disabled_info) );
            // 劳动力就业
            row1.add(h.numberOfOver60_agriculturalProduction);
            row1.add(h.numberOfOver60_migrantWorkers);
            row1.add(h.numberOfOver60_closedDown);
            row1.add(h.numberOfOver60_unemployed);
            row1.add(h.numberOfOver60_illiterate);
            row1.add(h.numberOfOver60_pre);
            row1.add(h.numberOfOver60_primary);
            row1.add(h.numberOfOver60_junior);
            row1.add(h.numberOfOver60_high);
            row1.add(h.numberOfOver60_collegeDegreeOrAbove);

            row1.add(formOne.bad_behavior);
            row1.add(formOne.exit);
            row1.add(formOne.exit_reason);
            row1.add(formOne.exit_destination);

            sheet2.add(row1);
        }

    }

    private void exportThree(List<FormTotalPor> formTotalPors,List<List<Object>> sheet1) {


        List<Object> row1;
        for (FormTotalPor formTotalPor : formTotalPors) {

            row1 = new ArrayList<>();
            int questionnaire_id = formTotalPor.getFormTotal().getQuestionnaire_base_info().questionnaire_id;
            FormTwo formTwo = formTotalPor.getFormTotal().getFormTwo();
            // 问卷 id
            row1.add(questionnaire_id);
            row1.add(formTwo.housing_source);
            row1.add(formTwo.housing_money);
            row1.add(formTwo.monthlyRental);// 月租
            row1.add(formTwo.house_time);// 住房购置时间
            row1.add(formTwo.housing_area);

            if("没有".equals(formTwo.other_housing)){
                row1.add(0);
            }else{
                row1.add(1);
            }
            row1.add(formTwo.other_housing_time);// 现有住房以外购置时间
            row1.add(formTwo.other_house_money);
            row1.add(formTwo.other_house_new_money);// 现值
            row1.add(formTwo.other_house_monthlyRental);// 月租
            row1.add(formTwo.other_house_new_money);

            row1.add(formTwo.car_number);
            row1.add(formTwo.transport_number);
            row1.add(formTwo.airconditioner_number);
            row1.add(formTwo.refrigerator_number);
            row1.add(formTwo.washing_number);
            row1.add(formTwo.tv_number);
            row1.add(formTwo.motorcycle_number);
            row1.add(formTwo.electric_number);
            row1.add(formTwo.computer_number);
            row1.add(formTwo.phone_number);
            row1.add(formTwo.house_site_number);
            row1.add(formTwo.have_arable_land);
            row1.add(formTwo.contract_arable_land);
            row1.add(formTwo.roam_arable_land);
            row1.add(formTwo.actual_planing_arable_land);
            row1.add(formTwo.woodland_area);
            row1.add(formTwo.mon_communication_fee);
            row1.add(formTwo.mon_electricity_fee);
            row1.add(formTwo.borrow_money_number);

            row1.add(formTwo.village_cadres_number);
            row1.add(formTwo.other_village_cadres_number);
            row1.add(formTwo.commercial_insurance_number);
            row1.add(formTwo.commercial_insurance_outcome);
            row1.add(formTwo.social_welface_organization_number);
            row1.add(formTwo.policy_borrow_number);
            row1.add(formTwo.policy_borrow_money);
            row1.add(formTwo.friend_borrow_number);
            row1.add(formTwo.friend_borrow_money);
            row1.add(formTwo.total_liabilities_money);

            sheet1.add(row1);
        }


    }

    private void exportFour(List<FormTotalPor> formTotalPors,List<List<Object>> sheet1) {


        List<Object> row1;
        for (FormTotalPor formTotalPor : formTotalPors) {

            row1 = new ArrayList<>();
            int questionnaire_id = formTotalPor.getFormTotal().getQuestionnaire_base_info().questionnaire_id;
            FormThree formThree = formTotalPor.getFormTotal().getFormThree();
            OperatingIncome operatingIncome = formThree.operatingIncome;// 经营性收入
            WageIncome wageIncome = formThree.wageIncome;// 工资性收入
            PropertyIncome propertyIncome = formThree.propertyIncome;// 财产性收入
            TransferIncome transferIncome = formThree.transferIncome;// 转移性收入

            // 问卷 id
            row1.add(questionnaire_id);

            // 经营性收入
            row1.add(operatingIncome.rice);
            row1.add(operatingIncome.corn);
            row1.add(operatingIncome.vegetables);
            row1.add(operatingIncome.fruit);
            row1.add(operatingIncome.tea);
            row1.add(operatingIncome.plantingOther);
            row1.add(operatingIncome.cattle);
            row1.add(operatingIncome.pig);
            row1.add(operatingIncome.sheep);
            row1.add(operatingIncome.chicken);
            row1.add(operatingIncome.duck);
            row1.add(operatingIncome.goose);
            row1.add(operatingIncome.fishPonds);
            row1.add(operatingIncome.farmingOther);
            row1.add(operatingIncome.selfEmployed);
            row1.add(operatingIncome.selfEmployedOucome);
            // 工资性收入
            row1.add(wageIncome.localFamlyNumber);
            row1.add(wageIncome.localFamlyIncome);
            row1.add(wageIncome.localFamlyIncome);// 地区
            row1.add(wageIncome.otherFamlyNumber);
            row1.add(wageIncome.otherFamlyIncome);
            // 财产性收入
            row1.add(propertyIncome.landTransferFund);
            row1.add(propertyIncome.depositInterest);
            row1.add(propertyIncome.collectiveBonuses);
            row1.add(propertyIncome.equityInterest);
            row1.add(propertyIncome.realEstateRent);
            row1.add(propertyIncome.financialDividends);
            // 转移性收入
            row1.add(transferIncome.alimony);
            row1.add(transferIncome.groundSubsidy);
            row1.add(transferIncome.forestrySubsidy);
            row1.add(transferIncome.landSubsidies);
            row1.add(transferIncome.livingAllowances);
            row1.add(transferIncome.scholarship);
            row1.add(transferIncome.retirementPay);
            row1.add(transferIncome.retirementPay);// 特困金

            sheet1.add(row1);
        }


    }

    private void exportFive(List<FormTotalPor> formTotalPors,List<List<Object>> sheet1) {


        List<Object> row1;
        for (FormTotalPor formTotalPor : formTotalPors) {

            row1 = new ArrayList<>();
            int questionnaire_id = formTotalPor.getFormTotal().getQuestionnaire_base_info().questionnaire_id;

            FormFour formFour = formTotalPor.getFormTotal().getFormFour();
            DailyConsumption dailyConsumption = formFour.dailyConsumption; // 日常消费支出
            NecessaryExpenses necessaryExpenses = formFour.necessaryExpenses;// 刚性支出
            SocialExpenditure socialExpenditure = formFour.socialExpenditure;// 交往支出
            SuddenExpenditure suddenExpenditure = formFour.suddenExpenditure;// 突发性支出

            // 问卷 id
            row1.add(questionnaire_id);
            // 日常消费支出
            row1.add(dailyConsumption.spendProject == null ?  "" : Arrays.toString(dailyConsumption.spendProject));
            row1.add(dailyConsumption.dailySpentMoney);
            row1.add(dailyConsumption.endowmentInsuranceCost);
            row1.add(dailyConsumption.foodExpenditurePoint);
            row1.add(dailyConsumption.mortgageSpending);
            row1.add(dailyConsumption.rentalFee);
            row1.add(dailyConsumption.communicationCosts);
            // 刚性支出
            row1.add(necessaryExpenses.educationNumber);
            row1.add(necessaryExpenses.educationOutCome);
            row1.add(necessaryExpenses.tuition);
            row1.add(necessaryExpenses.accommodation);
            row1.add(necessaryExpenses.bookMoney);
            row1.add(necessaryExpenses.livingExpenses);
            row1.add(necessaryExpenses.bigHealthSpending);
            row1.add(necessaryExpenses.bigPersonMoney);
            row1.add(necessaryExpenses.slowHealthSpending);
            row1.add(necessaryExpenses.slowPersonMoney);
            row1.add(necessaryExpenses.treatmentDisabledMoney);
            row1.add(necessaryExpenses.employmentMoney);
            // 社会交往支出
            row1.add(socialExpenditure.contactNumber);
            row1.add(socialExpenditure.contactMoney);
            row1.add(socialExpenditure.contactArrevgeMoney);
            // 突发性支出
            row1.add(suddenExpenditure.emergentEvent);
            row1.add(suddenExpenditure.emergentEventMoney);

            sheet1.add(row1);
        }


    }

    private void exportSix(List<FormTotalPor> formTotalPors,List<List<Object>> sheet1) {


        List<Object> row1;
        for (FormTotalPor formTotalPor : formTotalPors) {

            row1 = new ArrayList<>();
            int questionnaire_id = formTotalPor.getFormTotal().getQuestionnaire_base_info().questionnaire_id;
            String homestyle = formTotalPor.getFormTotal().getQuestionnaire_base_info().homestyle; // 判定结果
            WeightAlgorithm w = formTotalPor.getW();

            // 问卷 id
            row1.add(questionnaire_id);
            row1.add(w.age);
            row1.add(w.families);
            row1.add(w.labor);
            row1.add(w.health);
            row1.add(w.numberOfAged19_60_disability);
            row1.add(w.disable_style);
            row1.add(w.disabilitiesNumber);
            row1.add(w.other_housing);
            row1.add(w.other_house_area);
            row1.add(w.car_number);
            row1.add(w.financialAssets);
            row1.add(w.alimony);
            row1.add(w.perCapitaIncomeN);
            row1.add(w.perCapitaIncome);
            row1.add(w.individualBusinessIncome);
            row1.add(w.educationOutCome);
            row1.add(w.bigHealthSpending);
            row1.add(w.bigPersonMoney);
            row1.add(w.slowPersonMoney);
            row1.add(w.emergentEventMoney);
            row1.add(w.perHouseholdExpenditure);
            row1.add(w.perExpenditure);
            row1.add(w.minLivingSecurity);
            row1.add(w.minLivingSecurity_);
            row1.add(w.minLivingSecurity__);
            row1.add(w.minLivingSecurity___);
            row1.add(w.laborNumber);
            row1.add(w.laborProportion);
            row1.add(w.educationLevel);
            row1.add(w.healthStatus);
            row1.add(w.employmentStatus);
            row1.add(w.homesteadNumber);
            row1.add(w.cultivatedLandResources);
            row1.add(w.forestResources);
            row1.add(w.housingSource);
            row1.add(w.housingArea);
            row1.add(w.additionalPurchase);
            row1.add(w.durableGoods);
            row1.add(w.operatingIncome);
            // 工资性收入
            row1.add(w.wageIncome);
            row1.add(w.transferIncome);
            row1.add(w.propertyIncome);
            row1.add(w.groupCadres);
            row1.add(w.getHelp);
            row1.add(w.dailyCommunicationExpenses);
            row1.add(w.socialOrganizations);
            row1.add(w.socialInsurance);
            row1.add(w.discountLoan);
            row1.add(w.borrowMoney);
            row1.add(w.humanExpenditure);
            row1.add(w.numberOfOutsiders);
            row1.add(w.result);
            row1.add(homestyle);

            sheet1.add(row1);
        }


    }


}
